/***************************************************************************//**
 * @file	 csa37f7x_crc.h
 * @version  V1.0.0
 * @author	 Chipsea MCU Group
 * @date	 2020-10-21
 * @brief	 该文件包含CRC各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
 * @attention
 *	硬件平台: CSA37F70 评估版V1.0 \n
 *	SDK版本：  CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date 	   <th>Version	<th>Author	            <th>Description
 * <tr><td>2020/10/21  <td>1.0.0	<td>Chipsea MCU Group	<td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_CRC_H__
#define __CSA37F7X_CRC_H__

// Include external header file.
#include "csa37f7x.h"

#ifdef __CSA37F70__

#ifdef __cplusplus
extern "C" {
#endif

/** @addtogroup CRC CRC计算单元(CRC-32)
  CRC 计算单元可以用来按照既定的多项式算法，依据输入数据快速算出循环冗余校验的结果码。
在很多应用中，通常使用循环冗余校验的技术来检查数据传输或存储的完整性。 在功能安全标准范围
内，这提供了校验 Flash 存储可靠性的技术手段。 CRC 计算单元可随时计算软件签名，使得可以在通
讯和存储的时候就地完成签名比较。
    - 采用的 CRC-32（与以太网标准相同）多项式 0x4C11DB7  \n
       X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1
    - 操作 8，16，32 位数据
    - CRC 初值可预置
    - 单输入/输出 32 位数据寄存器
    - 每次 CRC 计算在 4 个 AHB 时钟周期（HCLK）内完成
    - 配有通用目的的 8 位寄存器（可被用来当作临时存储） 
    - 用来提供 I/O 数据的可逆性选项 
  @{
*/

/**
 * @brief 定义CRC反转输入数据格式
 */
typedef enum
{
	NO_REV = 0x00,  		/*!<CRC输入数据不翻转 */
	BYTE_REV = 0x01, 		/*!<CRC输入数据按字节为单位翻转 */
	HALT_BYTE_REV = 0x02, 	/*!<CRC输入数据按半字为单位翻转 */
	WORD_REV = 0x03,		/*!<CRC输入数据按字为单位翻转 */
} crc_rev_in_t;

/**
 * @brief 定义检查CRC输入数据有效字节位
 */
typedef enum
{
	BYTE_VALID = 0x00,		/*!<CRC输入数据有效位字节 */	
	HALF_WORD_VALID = 0x01, /*!<CRC输入数据有效位半字 */	
	WORD_VALID = 0x02, 		/*!<CRC输入数据有效位字 */	
} crc_valid_t;

/**
 * @brief 定义CRC初始化结构体
 */
typedef struct
{
	enable_state_t rev_out_en;		/*!<CRC翻转输出数据控制选择 1：翻转；0：不翻转 */
	crc_rev_in_t rev_in;			/*!<CRC翻转输入数据控制选择 */
	crc_valid_t valid_length;   	/*!<CRC输入数据有效字节位 */
}crc_config_t;

/**
* @brief 宏定义检查CRC反转输入数据
*/
#define CRC_RRV_IN_CHECK(value)			(((value) == NO_REV)||\
										((value) == BYTE_REV)||\
										((value) == HALT_BYTE_REV)||\
										((value) == WORD_REV))

/**
* @brief 宏定义检查CRC输入数据有效字节位
*/
#define CRC_VALID_LENGTH_CHECK(value)	(((value) == BYTE_VALID)||\
										((value) == HALF_WORD_VALID)||\
										((value) == WORD_VALID))

/**@brief		CRC功能初始化
 *
 * @param[in]	ptr_config		输入CRC初始化结构体
 * @return		无
*/
void crc_init(crc_config_t* ptr_config);

/**@brief		CRC校验
 *
 * @param[in]	dat			输入CRC校验初始值
 * @return		返回CRC校验结果
*/
uint32_t crc_data_calculate (uint32_t dat);

/**@brief		CRC8位独立数据保存
 *
 * @param[in]	dat 		输入需要保存的8位独立数据
 * @return		无
*/
void crc_idr_data_save (uint8_t dat);

/**@brief		CRC初始数据载入
 *
 * @param[in]	dat 		输入CRC校验初始值
 * @return		无
*/
void crc_init_data_load (uint32_t dat);



/*@}*/ /* end of group CRC */


#ifdef __cplusplus
}
#endif

#endif //__CSA37F70__

#endif  //__CSA37F7X_CRC_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/
